package primeraEntregaMain

import java.sql.Connection
import java.sql.DriverManager
import java.sql.ResultSet
import scala.collection.mutable.Buffer
import scala.collection.mutable.ListBuffer
import excepciones.NoExisteUsuarioException

case class UsuarioMapper {
//case class UsuarioMapper(sistema :Sistema) {
	
//	def getConnection: Connection = {
//	  	Class.forName("com.mysql.jdbc.Driver")
//		DriverManager.getConnection("jdbc:mysql://localhost/persistencia?user=root&password=123456skap")
//	}	
//	
//	/**
//	 * Mapea el usuario de la base de datos en un objeto Usuario.
//	 */
//	def mapUsuarioObjeto(usuario :ResultSet) :Usuario = {
//	  var usuarioRet = new Usuario()
//	  usuarioRet.nombre = usuario.getString("nombre")
//	  usuarioRet.apellido = usuario.getString("apellido") 
//	  usuarioRet.nombreDeUsuario = usuario.getString("nombreDeUsuario") 
//	  usuarioRet.email = usuario.getString("email") 
//      usuarioRet.fechaDeNacimiento = usuario.getDate("fechaDeNacimiento")
//      usuarioRet.password = usuario.getString("password")
//      usuarioRet.validado = usuario.getBoolean("validado")
//      usuarioRet
//	}
//	
//	/**
//	 * Devuelve el usuario mapeado a un objeto de la clase Usuario,
//	 * sacado de la base de datos.
//	 */
//	def dameElUsuario(nombreDeUsuario :String) :Usuario = {
//	  	val connection = getConnection
//		var query = connection.prepareStatement("SELECT * usuario WHERE nombreDeUsuario == ?");
//		query.setString(1, nombreDeUsuario)
//	  	var results :ResultSet = query.executeQuery
//		query.close
//		connection.close
//		if(results.next) mapUsuarioObjeto(results) else throw new NoExisteUsuarioException
//	}
//	
//	/**
//	 *  Se carga la informacion desde la base de datos a las listas
//	 *  de usuariosValidados y usuariosPorValidar del sistema.
//	 */	
//	def cargarInformacion = {
//	  	val connection = getConnection
//		var query = connection.prepareStatement("SELECT * FROM usuario");
//	  	var results :ResultSet = query.executeQuery
//		while(results.next)
//		  if(results.getString("validado") == "1")
//		    sistema.agregarUsuarioValidado(mapUsuarioObjeto(results))
//		  else
//		    sistema.agregarUsuarioPorValidar(mapUsuarioObjeto(results))
//	  	query.close
//		connection.close
//	}
//	
//	/**
//	 * Inserta un usuario a la base de datos.
//	 */
//	def almacenarUsuario(usuario :Usuario, validado :Boolean) = {
//	  	val connection = getConnection
//		var query = connection.prepareStatement("INSERT INTO usuario (nombre, apellido, nombreDeUsuario, email, fechaDeNacimiento, password, validado) VALUES (?, ?, ?, ?, ?, ?, ?)");
//		query.setString(1, usuario.nombre)
//		query.setString(2, usuario.apellido)
//		query.setString(3, usuario.nombreDeUsuario)
//		query.setString(4, usuario.email)
//		query.setString(5, usuario.fechaDeNacimiento.getYear.toString + "-" + 
//		    usuario.fechaDeNacimiento.getMonth.toString + "-" +
//		    usuario.fechaDeNacimiento.getDay.toString)
//		query.setString(6, usuario.password)
//		query.setBoolean(7, validado)
//		query.execute
//		query.close
//		connection.close
//	}
//
//	/**
//	 * Inserta un usuario validado en la base de datos.
//	 */
//	def almacenarUsuarioValidado(usuario :Usuario) = {
//		almacenarUsuario(usuario, true)
//	}
//	
//	/**
//	 * Inserta un usuario no validado en la base de datos.
//	 */
//	def almacenarUsuarioNoValidado(usuario :Usuario) = {
//	  	almacenarUsuario(usuario, false)
//	}
//	
//	/**
//	 * Busca usuarios de las listas usuariosValidados y usuariosPorValidar
//	 * del sistema que no se encuentren creados en las bases de datos
//	 * y los crea.
//	 */
//	def crearNuevosUsuarios = {
//	  	val connection = getConnection
//		var query = connection.prepareStatement("SELECT * FROM usuario");
//	  	var results :ResultSet = query.executeQuery
//		var usuariosDeBD = new ListBuffer[Usuario]
//	  	while(results.next)
//	  	  usuariosDeBD += mapUsuarioObjeto(results)
//	  	
//	  	for(usuarioDeSistema <- sistema.usuariosValidados) {
//	  	  if(!usuariosDeBD.exists(_.nombreDeUsuario.matches(usuarioDeSistema.nombreDeUsuario)))
//	  	    almacenarUsuarioValidado(usuarioDeSistema)
//	  	}
//	  	
//	  	for(usuarioDeSistema <- sistema.usuariosPorValidar.values) {
//	  	  if(!usuariosDeBD.exists(_.nombreDeUsuario.matches(usuarioDeSistema.nombreDeUsuario)))
//	  	    almacenarUsuarioNoValidado(usuarioDeSistema)
//	  	}
//
//	  	query.close
//		connection.close
//	}
//	
//	/**
//	 * Retorna true si el usuario tiene distinto campo del password o validado
//	 * entre la base de datos y el sistema.
//	 */
//	def usuarioModificado(usuario1 :Usuario, usuario2 :Usuario) :Boolean = {
//	  	usuario1.password != usuario2.password || usuario1.validado != usuario2.validado
//	}
//	
//	/**
//	 * Modifica los campos password y/o validado de un usuario en la
//	 * base de datos.
//	 */
//	def modificarUsuario(usuario :Usuario) = {
//	  	val connection = getConnection
//		var query = connection.prepareStatement("UPDATE usuario SET validado = ?, password = ? WHERE nombreDeUsuario = ?");
//		if(usuario.validado) query.setString(1, "1") else query.setString(1, "0")
//		query.setString(2, usuario.password)
//		query.setString(3, usuario.nombreDeUsuario)
//		query.execute
//		query.close
//		connection.close
//	}
//	
//	/**
//	 * Actualiza la informacion de los usuarios en la base de datos
//	 * que hayan sido modificados en el sistema.
//	 */
//	def actualizarInformacionDeUsuarios = {
//	  	val connection = getConnection
//		var query = connection.prepareStatement("SELECT * FROM usuario");
//	  	var results :ResultSet = query.executeQuery
//		var usuariosDeBD = new ListBuffer[Usuario]
//	  	while(results.next)
//	  	  usuariosDeBD += mapUsuarioObjeto(results)
//	  	  
//	  	for(usuarioDeSistema <- (sistema.usuariosValidados ++ sistema.usuariosPorValidar.values))
//	  		if(usuarioModificado(usuarioDeSistema, usuariosDeBD.find(_.nombreDeUsuario.matches(usuarioDeSistema.nombreDeUsuario)).get))
//	  		  modificarUsuario(usuarioDeSistema)
//	  	      
//	  	query.close
//		connection.close
//	}
//	
//	/**
//	 * Guarda toda la informacion del sistema en la base de datos.
//	 * Eso quiere decir crear los usuarios que no esten en la base de datos
//	 * y actualiza los que se encuentren desactualizados.
//	 */
//	def guardarInformacion = {
//	  	crearNuevosUsuarios
//	  	actualizarInformacionDeUsuarios
//	}

}